=begin
##################################################  #############################
#                                                                             #
#          						    	 Game_Time (Время/Дата)  	  				   	          #
#                                                                             #
##################################################  #############################
Автор: Денис Кузнецов (
http://vk.com/id8137201)
Версия: 5.1
Релиз от: 02.02.15
############# ИНСТРУКЦИЯ ##################################################  #####
  Время/Дата:
  Чтобы изменить время, воспользуйтесь скриптом
  Now_Time.change(sec, min, hour, day, dayweek, month, year)
  sec - секунды
  min - минуты
  hour - час
  day - день
  dayweek - день недели
  month - месяц
  year - год
  Пример: Now_Time.change(30, 2, 3, 5, 7, 4, 201)
  
  Чтобы получить текущую дату используйте:
  $Game_Time.sec
	min, hour, day, dayweek, month, year
	Чтобы сохранить время или загрузить его, используйте:
	Now_Time.save_time
	Now_Time.load_time
  Чтобы добавить время, используйте скрипты:
  Now_Time.time(+5, :min) - добавит 5 минут
  Now_Time.time(-10,:hour) - удалит 10 часов
  Возможно: :sec, :min, :hour, :day, :month, :year
	Чтобы показать/скрыть все окна принудительно, воспользуйтесь
	Now_Time.windows_visible?(flag)
	где flag - true/false (показать/скрыть)
	Чтобы включить/отлючить переключение света в дневном диапозоне, используйте
	Now_Time.setup_khas_day_light(flag)
	где flag - true/false (вкл/выкл)
=end
############# НАТРОЙКА ##################################################  #######
module Calendar_Settings
	# Название дней недели
	DAYS_WEEK = [ "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"]
	# Формативный вывод месяцев
	CALENDAR_MONTHS = [ "Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", 
		"Сентября", "Октября", "Ноября", "Декабря" ]
end
module Time_Settings
	include Calendar_Settings
	# не трогать это 

 настройки ниже
	begin
		include Weather_Settings_Module
	rescue
	end
	# не трогать это 

 настройки ниже
	
	#----- Начало настройки дня и ночи ---------------------------------------------	
	# Использовать смену дня и ночи ? true - да, false - нет
	USE_LIGHT_TINT = true
	
	# Исользовать стандартную смену дня и ночи ? true - да, false - нет
	# Если используете эту опцию, то установите USE_KHAS_LIGHT = false
	USE_DEFAULT_LIGHT = false	
	
	# Использовать Khas Light Effect ? true - да, false - нет
	USE_KHAS_LIGHT = true
	
	# Номер переключателя
	# Если вы используете $USE_KHAS_LIGHT_SWITCH
	# Чтобы не использовать установите -1
	KHAS_LIGHT_SWITCH = 3
	
	# Использовать диапозон времени для переключения переключателя ?
	# Только если вы используете Khas Light Effect
	$USE_KHAS_DAY_LIGHT = false
	
	# Диапозон времени, когда свет не горит (день),
	# Если вы используете смену дня и ночи
	KHAS_DAY_LIGHT = [8, 19] # с 8 утра до 7 вечера свет не горит
	# То есть переключатель будет false
	
	
	# Использовать динамическую смену дня и ночи ?
	# Если используется Khas Light Effect
	# Переключатель будет контролироваться автоматически
	USE_DYNAMIC_LIGHT = true
	
	
	# Использовать оттенки экрана в битвах ? true - да, false - нет
	USE_LIGHT_IN_BATTLE = true
	
	# Настройка оттенков экрана для каждого часа.
	# Если используете USE_DYNAMIC_LIGHT, то эта настройка ничего не даст.
	# [Color.new(R, G, B, A)]
	TINTS = [ Color.new(30, 0, 40, 165), # => 0 час
		Color.new(20, 0, 30, 165), 		 # => 1 час
		Color.new(20, 0, 30, 155), 		 # => 2 час
		Color.new(10, 0, 30, 145), 		 # => 3 час
		Color.new(10, 0, 20, 125), 		 # => 4 час
		Color.new(0,0,20,125), 		   # => 5 час
		Color.new(75,20,20,115), 		 # => 6 час
		Color.new(100,30,10,105),    # => 7 час
		Color.new(75,20,10,85), 		 # => 8 час
		Color.new(0,0,0,55), 				 # => 9 час
		Color.new(0,0,0,30), 				 # => 10 час
		Color.new(0,0,0,10), 				 # => 11 час
		Color.new(0,0,0,0), 				 # => 12 час
		Color.new(0,0,0,0), 				 # => 13 час
		Color.new(0,0,0,0), 				 # => 14 час
		Color.new(0,0,0,5), 				 # => 15 час
		Color.new(0,0,0,15), 				 # => 16 час
		Color.new(0,0,10,45), 			 # => 17 час
		Color.new(75,20,20,85), 		 # => 18 час
		Color.new(100,40,30,105),  	 # => 19 час
		Color.new(75,20,40,125), 		 # => 20 час
		Color.new(10,0,45,140), 		 # => 21 час
		Color.new(20,0,45,145), 		 # => 22 час
		Color.new(20,0,50,160) ]		 # => 23 час
	
	#----- Конец настройки дня и ночи ----------------------------------------------
	
	#----- Начало настройки времени ------------------------------------------------
	
	# Использовать дату с компьюетера ? true - да, false - нет
	USE_REAL_TIME = false
	
	# Остановить время в меню ? true - да, false - нет
	PAUSE_IN_MENU = true
	
	# Отображать окно в меню ? true - да, false - нет
	TIME_IN_MENU = true
	
	# Секунд в минуте (минимум 2)
	# Для лучшего эффекта лучше оставить 60, если SHOW_SECONDS = false, но это
	# уже на ваше усмотрение
	SECONDS_IN_MINUTE = 2
	# Минут в часе (минимум 2)
	MINUTES_IN_HOUR = 60
	# Часов в дне
	HOURS_IN_DAY = 24
	
	# Использовать обновление времени в битве ? true - да, false - нет
	USE_TIME_UPDATE_IN_BATTLE = true
	
	# Отображать секунды в часах ? true - да, false - нет
	SHOW_SECONDS = false
	
	# Использовать кастомные часы в игре ? true - да, false - нет
	USE_CUSTOM_CLOCK_ON_MAP = false
	
	# Ширина окна времени в игре
	CLOCK_WIDTH = 180
	# Высота окна времени в игре
	CLOCK_HEIGHT = 74
	# Координата X окна времени в игре
	CLOCK_X = Graphics.width - CLOCK_WIDTH
	# Координата Y окна времени в игре
	CLOCK_Y = Graphics.height - CLOCK_HEIGHT
	# Непрозрачность окна в игре. -1 = стандартное
	OPACITY_CLOCK = -1
	
	# Использовать кастомные часы в игре ? true - да, false - нет
	USE_CUSTOM_CLOCK_IN_MENU = false
	
	# Ширина окна времени в игре
	MENU_CLOCK_WIDTH = 200
	# Высота окна времени в игре
	MENU_CLOCK_HEIGHT = 90
	# Координата X окна времени в игре
	MENU_CLOCK_X = 0
	# Координата Y окна времени в игре
	MENU_CLOCK_Y = 0
	# Непрозрачность окна в меню. -1 = стандартное
	OPACITY_MENU_CLOCK = -1
	
	# Настройка кастомных часов
	# Возможно: День, День недели, Месяц(число), Месяц(название), Год
	# Также возможны свои команды
	CUSTOM_CLOCK_DATE = ["День", "Месяц(название)", "Год"]
	# Возможно: Час, blink(":"), Минуты, Секунды
	CUSTOM_CLOCK_TIME = ["Час", "blink", "Минуты"]
	
	# Скорость времени
	# (Минимум - 1, Максимум - 60!). 
	# Чем меньше цифра, тем быстрее идет время. 60 - Реальное время
	$TIME_SPEED = 1
	
	# Использовать мерцание ":" в часах ? true - да, false - нет. Отключение может повысить FPS на 1-5
	USE_BLINK = false
	
	# Частота обновления ":" в отображении времени и частота обновления завершающихся квестов (40 - оптимально)
	BLINK_SPEED = 40
	
	# Чтобы на определенной карте приостановить обновление времени, используйте заметки карты и пропишите там: <No_Time_Update>
	# Чтобы на определенной карте выставить освещение определенного часа, используйте заметки карты: <Light_Hour = H>
	# где H - нужный час
	
	# Настройка начала игры! Если не используете реальное время.
	SEC   = 0 # Секунды
	MIN   = 0 # Минуты
	HOUR  = 0 # Час
	DAY   = 2 # День
	DAY_WEEK = 1 # В диапозоне от 1 до 7 (1 - Понедельник, 7 - Воскресенье)
	MONTH = 1 # Месяц
	YEAR = 2015 # Год
	
	# Количество дней в каждом месяце
	DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
	
	# Кнопка отображения/скрытия окна времени
	# -1, чтобы не использовать
	GAME_TIME_BUTTON = :Z
	
	# Показывать окно времени в начале игры ? true - да, false - нет
	$SHOW_START_GAME_TIME_WINDOW = true
	
	############# КОНЕЦ НАСТРОЙКИ ##################################################
	############# НИЖЕ НЕ ТРОГАТЬ !!! ##############################################
	
	# Обновление времени
	$STOP_TIME_UPDATE = false
	# Час статического освещения
	$STOP_TIME_UPDATE_LIGHT_HOUR = -1
	
end
$imported = {} if $imported.nil?
$imported["DenKyz_Game_Time"] = true
class Functions
	include Time_Settings
	
	def self.new_game # новая игра
		$QUESTS = []
		$LAST_QUESTS = []
		$NOTIFICATION_WINDOW = []
		Now_Time.new
	end
	
	def self.setup_khas_light_switch(hour) # hour - час, если диапозон вкл; bool, если диапозон выкл.
		return if !USE_KHAS_LIGHT || KHAS_LIGHT_SWITCH == -1
		return if ($USE_KHAS_DAY_LIGHT && !hour.is_a?(Integer)) || (!$USE_KHAS_DAY_LIGHT && hour.is_a?(Integer))
		if $USE_KHAS_DAY_LIGHT
			if (hour < KHAS_DAY_LIGHT[0] || hour > KHAS_DAY_LIGHT[1])
				$game_switches[KHAS_LIGHT_SWITCH] = true
			else
				$game_switches[KHAS_LIGHT_SWITCH] = false
			end
		else
			$game_switches[KHAS_LIGHT_SWITCH] = hour
		end
	end
	
end # class Functions
class Now_Time
	include Time_Settings
	
	def initialize
		# 0 и больше 60 не будет обновляться
		$TIME_SPEED = 60 if $TIME_SPEED > 60
		$TIME_SPEED = 1 if $TIME_SPEED < 1
		$Game_Time = Game_Time.new
		$UPDATE_DYNAMIC_TINT = true
		$Game_Time_Tint = Game_Time_Tint.new if USE_LIGHT_TINT
		begin
			$CALENDAR_NOTIFY = 1 if $CALENDAR_NOTIFY > MINUTES_IN_HOUR
		rescue
		end
		begin
			$USE_DEFAULT_WEATHER = USE_DEFAULT_WEATHER
			$Cur_day_temp = TEMPERATURE_MAX if !USE_DYNAMIC_TEMPERATURE
			$Cur_day_temp = TEMPERATURE_MAX + (1 + rand(2) - (1 + rand(2))) if USE_DYNAMIC_TEMPERATURE
			$Game_Time_Temperature = Functions.new_game_calculation_degrees if USE_TEMPERATURE
		rescue
		end
	end
	
	def self.change(sec, min, hour, day, dayweek, month, year)
		$Game_Time.change(sec, min, hour, day, dayweek, month, year)
		update # насколько он тут нужен ?
	end
	
	def self.update
		$Game_Time.update
	end
	
	def self.save_time # сохраняем время
		$Game_Time_DUP = $Game_Time.dup
	end
	
	def self.load_time # загружаем время
		$Game_Time = $Game_Time_DUP.dup
	end
	
	def self.time(value, type) #изменение времени
		$Game_Time.time(value, type)
	end
	
	def self.windows_visible?(flag) # пок/скр все окна
		SceneManager.scene.all_visible(flag)
	end
	
	def self.setup_khas_day_light(setup) #вкл/выкл диапозон переключения света
		$USE_KHAS_DAY_LIGHT = setup
	end
	
end # class Now_Time
class Game_Time
	include Time_Settings
	
	attr_reader     :sec
	attr_reader     :min
	attr_reader     :hour
	attr_reader     :day
	attr_reader     :dayweek
	attr_reader     :month
	attr_reader     :year
	
	def initialize
		@sec = SEC
		@min = MIN
		@hour = HOUR
		@day = DAY
		# потому что от 0-6, а игрок указывает от 1-7. 0 - Понедельник
		# а от 0-6 потому что в массиве дней недели индексы с 0
		# та же причина и у MONTH ниже
		@dayweek = DAY_WEEK - 1 
		@month = MONTH - 1
		@year = YEAR
		$FIRST_DAY = DAY_WEEK # первый день января (для календаря). Там 1-7 значения
	end
	
	
	def update
		return if !USE_TIME_UPDATE_IN_BATTLE && SceneManager.scene.is_a?(Scene_Battle)
		return if $game_message.busy?
		return real_time if USE_REAL_TIME
		return if !SceneManager.scene.is_a?(Scene_Map) || (SceneManager.scene.is_a?(Scene_Menu) && PAUSE_IN_MENU)
		return unless Graphics.frame_count % $TIME_SPEED == 0
		add_sec(1)
	end
	
	def change(sec, min, hour, day, dayweek, month, year)
		sec > @sec ? (sec - @sec).times do add_sec(1) end : (@sec - sec).times do rem_sec(1) end
		min > @min ? (min - @min).times do add_min(1) end : (@min - min).times do rem_min(1) end
		hour > @hour ? (hour - @hour).times do add_hour(1) end : (@hour - hour).times do rem_hour(1) end
		day > @day ? (day - @day).times do add_day(1) end : (@day - day).times do rem_day(1) end
		@dayweek = dayweek - 1
		month -= 1
		month > @month ? (month - @month).times do add_month(1) end : (@month - month).times do rem_month(1) end
		year > @year ? add_year(year - @year) : rem_year(@year - year)
		all_days = 0 # сумма дней с января до нужного месяца (не включая)
		for i in 0..month - 1
			all_days += Time_Settings:

AYS[i]
		end
		$FIRST_DAY = (dayweek + 1 -(day + all_days % DAYS_WEEK.size)) % DAYS_WEEK.size
		enable_dynamic_tint_update
	end
	
	def time(value, type)
		# логика такая: чтобы не пропустить события на карте вместо просто изменения
		# времени я прибавляю меньшие значения. 
		# Пример 1: +2 минуты = + прибавляю 120 секунд
		# Пример 2: +1 месяц = + кол-во часов в месяце
		# Все сделать через секунды нельзя (слишком большая задержка на экране возникает)
		case type
		when :sec
			set = :sec
		when :min
			set = :sec
			value *= SECONDS_IN_MINUTE
		when :hour
			set = :min
			value *= MINUTES_IN_HOUR
		when :day
			set = :hour 
			value *= HOURS_IN_DAY
		when :month
			set = :hour
			for i in 1..(value > 0 ? value :  value * -1) # value - сколько было
				val = DAYS[@month] * HOURS_IN_DAY # val - считаем для текущего месяца часы
				if value > 0
					val.times do eval("add_" + set.to_s + "(1)") end
				else
					val.times do eval("rem_" + set.to_s + "(1)") end
				end
			end
			return
		when :year
			set = :day
			sum = 0
			for i in 0..DAYS.size - 1 
				sum += DAYS[i]
			end
			value *= sum
		end # case type
		
		if value > 0
			value.times do eval("add_" + set.to_s + "(1)") end
		else
			value = -value
			value.times do eval("rem_" + set.to_s + "(1)") end
		end
		enable_dynamic_tint_update
	end
	
	def enable_dynamic_tint_update
		return if !USE_DYNAMIC_LIGHT
		$UPDATE_DYNAMIC_TINT = true
	end
	
	def real_time # время с компьютера
		@sec = Time.now.sec
		@sec = 0 if @sec >= SECONDS_IN_MINUTE
		@min = Time.now.min
		@hour = Time.now.hour
		if @day != Time.now.day
			@day = Time.now.day
			enable_dynamic_tint_update
		end
		@dayweek = Time.now.wday
		if @month != Time.now.month - 1
			@month = Time.now.month - 1 # причина в initialize
			enable_dynamic_tint_update
		end
		@year = Time.now.year
	end
	
	def add_sec(n = 1)
		@sec += n
		return unless @sec == SECONDS_IN_MINUTE
		@sec = 0
		add_min(1)
	end
	
	def add_min(n = 1)
		if $imported["DenKyz_Game_Time_Weather"]
			begin
				if (@min % 10 == 0) && USE_TEMPERATURE
					$Game_Time_Temperature += Functions.add_degrees
				end
			rescue # обработка исключения
			end
		end
		@min += n
		return unless @min == MINUTES_IN_HOUR
		@min = 0
		add_hour(1)
	end
	
	def add_hour(n = 1)
		@hour += n
		return unless @hour == HOURS_IN_DAY
		@hour = 0
		add_day(1)
	end
	
	def add_day(n = 1)
		@day += n
		@dayweek += n
		if $imported["DenKyz_Game_Time_Weather"]
			begin
				$Cur_day_temp = TEMPERATURE_MAX + (1 + rand(2) - (1 + rand(2))) if USE_DYNAMIC_TEMPERATURE
			rescue
			end
		end
		enable_dynamic_tint_update
		@dayweek = 0 if @dayweek == DAYS_WEEK.size
		return unless @day == DAYS[@month] + 1
		@day = 1
		add_month(1)
	end
	
	def add_month(n = 1)
		@month += n
		enable_dynamic_tint_update
		return unless @month == MONTHS.size
		@month = 0
		add_year(1)
	end
	
	def add_year(n = 1)
		@year += n
	end
	
	def rem_sec(n = 1)
		@sec -= n
		return unless @sec == -1
		@sec = SECONDS_IN_MINUTE - 1
		rem_min(1)
	end
	
	def rem_min(n = 1)
		@min -= n
		return unless @min == -1
		@min = MINUTES_IN_HOUR - 1
		rem_hour(1)
	end
	
	def rem_hour(n = 1)
		@hour -= n
		return unless @hour == -1
		@hour = HOURS_IN_DAY - 1
		rem_day(1)
	end
	
	def rem_day(n = 1)
		@day -= n
		@dayweek -= n
		if $imported["DenKyz_Game_Time_Weather"]
			begin
				$Cur_day_temp = TEMPERATURE_MAX + (1 + rand(2) - (1 + rand(2))) if USE_DYNAMIC_TEMPERATURE
			rescue
			end
		end
		@dayweek = DAYS_WEEK.size - 1 if @dayweek == -1
		return unless @day == 0
		@day = DAYS[@month-1]
		rem_month(1)
	end
	
	def rem_month(n = 1)
		@month -= n
		return unless @month == -1
		@month = MONTHS.size - 1
		rem_year(1)
	end
	
	def rem_year(n = 1)
		@year -= n
	end
	
end # class Game_Time
class Game_Time_Tint < Sprite_Base
	include Time_Settings
	
	def initialize(viewport = nil)
		super(viewport)
		self.z = 1
		create_contents
		update
	end
	
	def create_contents
		self.bitmap = Bitmap.new(Graphics.width, Graphics.height)
		self.visible = false
	end
	
	def update
		return if !USE_LIGHT_TINT
		return use_default_light if USE_DEFAULT_LIGHT && (@now_min != $Game_Time.min || $STOP_TIME_UPDATE_LIGHT_HOUR != -1)
		return use_khas_light if USE_KHAS_LIGHT && (@now_min != $Game_Time.min || $STOP_TIME_UPDATE_LIGHT_HOUR != -1)
	end
	
	def settings
		Functions.setup_khas_light_switch($Game_Time.hour) if $STOP_TIME_UPDATE_LIGHT_HOUR == -1
		
		@now_min = $Game_Time.min
		@hour = $Game_Time.hour
		
		if $STOP_TIME_UPDATE_LIGHT_HOUR != -1
			@hour = $STOP_TIME_UPDATE_LIGHT_HOUR
		elsif USE_DYNAMIC_LIGHT
			return update_dynamic_light
		end
		
		@now_hour = TINTS[@hour]
		@next_hour = TINTS[@hour + 1] unless @hour + 1 == HOURS_IN_DAY
		@next_hour = TINTS[0] if @hour + 1 == HOURS_IN_DAY
	end
	
	def use_default_light
		settings
		r = (@now_hour.red.to_f + (@next_hour.red.to_f - @now_hour.red.to_f)/60 * @now_min)/2
		g = @now_hour.green.to_f + (@next_hour.green.to_f - @now_hour.green.to_f)/60 * @now_min
		b = 0.9 * (@now_hour.blue.to_f + (@next_hour.blue.to_f - @now_hour.blue.to_f)/60 * @now_min)
		a = 1.3 * (@now_hour.alpha.to_f + (@next_hour.alpha.to_f - @now_hour.alpha.to_f)/60 * @now_min)
		self.visible = true
		self.bitmap.clear
		self.bitmap.fill_rect(0, 0, Graphics.width, Graphics.height, Color.new(r, g, b, a))
	end
	
	def use_khas_light
		settings
		begin
			r = @now_hour.red.to_f + (@next_hour.red.to_f - @now_hour.red.to_f)/60 * @now_min
			g = @now_hour.green.to_f + (@next_hour.green.to_f - @now_hour.green.to_f)/60 * @now_min
			b = @now_hour.blue.to_f + (@next_hour.blue.to_f - @now_hour.blue.to_f)/60 * @now_min
			a = @now_hour.alpha.to_f + (@next_hour.alpha.to_f - @now_hour.alpha.to_f)/60 * @now_min
			$game_map.effect_surface.change_color(1, r, g, b, a)
		rescue
		end
	end
	
	def red(hour, month) # здесь творится магия программирования 

		tint = [
			[0, 0, 0, 0, 0, 10, 20, 60, 100, 70, 20, 10, 0, 0, 20, 40, 100, 80, 50, 20, 10, 0, 0, 0],
			[0, 0, 0, 0, 10, 20, 30, 75, 100, 60, 20, 10, 0, 0, 10, 20, 40, 100, 80, 50, 20, 10, 0, 0],
			[0, 0, 0, 10, 20, 30, 75, 100, 60, 20, 10, 0, 0, 0, 10, 20, 30, 50, 100, 80, 60, 30, 10, 0],
			[0, 10, 20, 30, 50, 80, 100, 60, 20, 10, 0, 0, 0, 0, 0, 10, 20, 30, 50, 100, 80, 60, 30, 10],
			[10, 20, 30, 50, 80, 100, 60, 20, 10, 5, 0, 0, 0, 0, 0, 0, 10, 15, 30, 50, 100, 80, 60, 30],
			[20, 40, 60, 80, 100, 60, 45, 30, 15, 10, 0, 0, 0, 0, 0, 0, 10, 15, 30, 50, 80, 100, 80, 60],
			[10, 30, 50, 75, 100, 75, 50, 30, 15, 10, 0, 0, 0, 0, 0, 0, 10, 15, 30, 50, 80, 100, 80, 60],
			[10, 20, 45, 60, 80, 100, 60, 35, 15, 10, 0, 0, 0, 0, 0, 10, 15, 30, 50, 75, 100, 75, 50, 20],
			[0, 10, 20, 30, 40, 60, 100, 80, 45, 30, 15, 10, 0, 0, 0, 10, 30, 50, 80, 100, 70, 50, 20, 0],
			[0, 0, 10, 20, 30, 45, 75, 100, 80, 60, 40, 20, 0, 10, 30, 45, 80, 100, 80, 60, 40, 20, 0, 0],
			[0, 0, 10, 20, 30, 50, 70, 100, 80, 60, 30, 20, 10, 20, 40, 75, 100, 80, 60, 40, 20, 10, 0, 0],
			[0, 0, 0, 10, 20, 30, 50, 70, 100, 70, 50, 20, 0, 10, 30, 60, 100, 75, 40, 20, 10, 0, 0, 0]]
		return tint[month][hour]
	end
	
	def green(hour, month)
		tint = [
			[0, 0, 0, 0, 0, 5, 10, 20, 30, 20, 10, 0, 0, 0, 10, 15, 25, 15, 10, 0, 0, 0, 0, 0],
			[0, 0, 0, 0, 0, 5, 10, 20, 30, 20, 10, 0, 0, 0, 10, 15, 20, 25, 15, 10, 0, 0, 0, 0],
			[0, 0, 0, 0, 5, 10, 20, 30, 20, 10, 0, 0, 0, 0, 0, 5, 10, 25, 10, 5, 0, 0, 0, 0],
			[0, 0, 0, 0, 5, 10, 30, 20, 10, 5, 0, 0, 0, 0, 0, 0, 0, 10, 15, 30, 15, 10, 0, 0],
			[0, 0, 0, 10, 15, 30, 15, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 15, 25, 15, 10, 0],
			[0, 0, 10, 20, 30, 20, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 15, 30, 15, 0],
			[0, 0, 10, 15, 30, 15, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 15, 0],
			[0, 0, 0, 10, 20, 30, 15, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 20, 10, 0],
			[0, 0, 0, 0, 10, 20, 30, 15, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 15, 10, 0, 0],
			[0, 0, 0, 0, 0, 10, 15, 30, 10, 0, 0, 0, 0, 0, 0, 5, 15, 25, 15, 10, 0, 0, 0, 0],
			[0, 0, 0, 0, 0, 10, 20, 30, 20, 10, 0, 0, 0, 0, 10, 20, 30, 20, 10, 0, 0, 0, 0, 0],
			[0, 0, 0, 0, 0, 0, 10, 15, 30, 15, 10, 0, 0, 0, 10, 15, 30, 15, 10, 0, 0, 0, 0, 0]]
		return tint[month][hour]
	end
	
	def blue(hour, month)
		tint = [ 
			[10, 15, 20, 25, 30, 45, 30, 20, 10, 0, 0, 0, 0, 0, 0, 15, 20, 55, 45, 30, 20, 10, 0, 0],
			[10, 15, 20, 25, 30, 40, 20, 15, 10, 0, 0, 0, 0, 0, 0, 0, 15, 20, 55, 45, 30, 20, 10, 0],
			[10, 15, 25, 30, 40, 30, 20, 15, 10, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 50, 45, 40, 35, 20],
			[15, 20, 20, 35, 45, 25, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 15, 25, 35, 50, 40, 35, 20],
			[15, 20, 35, 45, 25, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 35, 55, 40, 30],
			[15, 30, 50, 35, 20, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 50, 30],
			[15, 30, 50, 30, 20, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 50, 25],
			[10, 15, 30, 50, 20, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 35, 50, 35, 20],
			[10, 15, 25, 35, 50, 30, 20, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 55, 35, 20, 15],
			[10, 15, 20, 25, 35, 50, 30, 20, 10, 0, 0, 0, 0, 0, 0, 10, 20, 35, 55, 40, 30, 20, 15, 10],
			[10, 10, 15, 20, 35, 55, 35, 20, 10, 0, 0, 0, 0, 10, 20, 30, 40, 55, 35, 20, 15, 15, 10, 10],
			[10, 15, 20, 25, 35, 55, 35, 20, 10, 0, 0, 0, 0, 10, 20, 30, 45, 60, 40, 30, 20, 15, 15, 10]]
		return tint[month][hour]
	end
	
	def alpha(hour, month)
		tint = [
			[175, 170, 160, 160, 150, 150, 145, 140, 120, 90, 55, 20, 10, 10, 10, 15, 25, 75, 105, 135, 155, 160, 165, 180],
			[170, 165, 155, 150, 140, 130, 130, 125, 110, 80, 50, 20, 10, 10, 10, 15, 25, 70, 95, 125, 140, 150, 160, 175],
			[165, 160, 150, 135, 130, 110, 115, 110, 90, 70, 45, 20, 10, 10, 10, 10, 20, 60, 80, 105, 120, 135, 150, 160],
			[160, 150, 140, 120, 120, 100, 90, 85, 70, 60, 40, 15, 10, 10, 10, 10, 20, 40, 60, 85, 100, 120, 135, 150],
			[155, 140, 130, 110, 105, 85, 75, 70, 50, 45, 35, 15, 10, 10, 10, 10, 10, 20, 40, 70, 85, 110, 125, 140],
			[150, 130, 120, 100, 90, 70, 55, 50, 40, 30, 35, 10, 10, 10, 10, 10, 10, 15, 25, 55, 65, 100, 105, 130],
			[145, 120, 110, 110, 100, 80, 70, 65, 55, 40, 35, 10, 10, 10, 10, 10, 10, 25, 40, 70, 80, 110, 125, 140],
			[150, 130, 120, 120, 110, 100, 85, 80, 70, 50, 40, 15, 10, 10, 10, 10, 10, 40, 60, 80, 100, 120, 130, 140],
			[155, 140, 130, 130, 120, 110, 100, 95, 85, 60, 45, 15, 10, 10, 10, 10, 10, 50, 70, 90, 115, 130, 140, 150],
			[160, 150, 140, 140, 130, 120, 115, 110, 100, 70, 50, 20, 10, 10, 10, 10, 15, 60, 80, 100, 130, 140, 150, 155],
			[165, 160, 150, 150, 140, 130, 130, 125, 110, 80, 55, 20, 10, 10, 10, 15, 20, 70, 90, 115, 145, 150, 155, 160],
			[170, 170, 160, 160, 150, 150, 145, 140, 120, 90, 60, 25, 10, 10, 10, 15, 25, 75, 105, 135, 155, 160, 165, 170]]
		return tint[month][hour]
	end
	
	def update_dynamic_light
		return set_dynamic_light if !$UPDATE_DYNAMIC_TINT
		@tint = []
		minus = 7
		no_zero = 6 + minus * 1.5
		month = $Game_Time.month
		
		for i in 0..23
			@tint[i] = Color.new(red(i, month) - minus + rand(no_zero), green(i, month) - minus + rand(no_zero), blue(i, month) - minus + rand(no_zero), alpha(i, month) - minus + rand(no_zero))
		end
		
		$UPDATE_DYNAMIC_TINT = false
		return set_dynamic_light
	end
	
	def set_dynamic_light
		Now_Time.setup_khas_day_light(false) # отключаем обычную смену переключателя
		setup = false
		setup = true if @tint[@hour].alpha > 100
		Functions.setup_khas_light_switch(setup)
		@now_hour = @tint[@hour]
		@next_hour = @tint[@hour + 1] unless @hour + 1 == HOURS_IN_DAY
		@next_hour = @tint[0] if @hour + 1 == HOURS_IN_DAY
	end
	
end # class Game_Time_Tint < Sprite_Base
class Scene_Base
	
	alias denis_kyznetsov_game_time_scn_base_update update
	def update
		denis_kyznetsov_game_time_scn_base_update
		$Game_Time.update if $Game_Time && !$STOP_TIME_UPDATE
		$Game_Time_Tint.update if $Game_Time_Tint || ($Game_Time_Tint && USE_LIGHT_IN_BATTLE && SceneManager.scene.is_a?(Scene_Battle))
	end
	
end # class Scene_Base
class Scene_Map < Scene_Base
	include Time_Settings
	
	alias denis_kyznetsov_game_time_scn_map_create_all_windo  ws create_all_windows
	def create_all_windows
		denis_kyznetsov_game_time_scn_map_create_all_windo  ws
		
		if $SHOW_START_GAME_TIME_WINDOW
			create_time_window
			@time_window_exist = true
		end
		if $imported["DenKyz_Game_Time_Calendar"]
			begin
				if USE_CALENDAR && $SHOW_START_GAME_CALENDAR_WINDOW && USE_CALENDAR_WINDOW
					create_calendar_window
					@calendar_window_exist = true
				end
			rescue
			end
		end
		if $imported["DenKyz_Game_Time_Weather"]
			begin
				if USE_TEMPERATURE_WINDOW && USE_TEMPERATURE && $SHOW_START_GAME_TIME_TEMPERATURE
					create_temp_window
					@temp_window_exist = true
				end
			rescue
			end
		end
	end
	
	def all_visible(flag)
		time_visible(flag)
		calendar_visible(flag)
		temp_visible(flag)
	end
	
	def time_visible(flag)
		if !flag
			return if !@time_window_exist
			$SHOW_START_GAME_TIME_WINDOW = !$SHOW_START_GAME_TIME_WINDOW
			@create_time_window.dispose
			@create_time_window = 0
			@time_window_exist = false
		else
			return if @time_window_exist
			$SHOW_START_GAME_TIME_WINDOW = !$SHOW_START_GAME_TIME_WINDOW
			create_time_window
			@time_window_exist = true
		end
	end
	
	def calendar_visible(flag)
		return if !USE_CALENDAR || !$imported["DenKyz_Game_Time_Calendar"]
		if !flag
			return if !@calendar_window_exist
			$SHOW_START_GAME_CALENDAR_WINDOW = !$SHOW_START_GAME_CALENDAR_WINDOW
			@create_calendar_scene_map.dispose
			@create_calendar_scene_map = 0
			@calendar_window_exist = false
		else
			return if @calendar_window_exist
			$SHOW_START_GAME_CALENDAR_WINDOW = !$SHOW_START_GAME_CALENDAR_WINDOW
			create_calendar_window
			@calendar_window_exist = true
		end
	end
	
	def temp_visible(flag)
		return if !USE_TEMPERATURE || !$imported["DenKyz_Game_Time_Weather"]
		if !flag
			return if !@temp_window_exist
			$SHOW_START_GAME_TIME_TEMPERATURE = !$SHOW_START_GAME_TIME_TEMPERATURE
			@create_temp_window.dispose
			@create_temp_window = 0
			@temp_window_exist = false
		else
			return if @temp_window_exist
			$SHOW_START_GAME_TIME_TEMPERATURE = !$SHOW_START_GAME_TIME_TEMPERATURE
			create_temp_window
			@temp_window_exist = true
		end
	end
	
	def create_temp_window
		dx, dy = TEMPERATURE_X, TEMPERATURE_Y
		dw, dh = 120, 50
		@create_temp_window = Temperature_Window.new(dx, dy, dw, dh)
	end
	
	def create_time_window
		x, y, w, h = CLOCK_X, CLOCK_Y, CLOCK_WIDTH, CLOCK_HEIGHT
		w, h = 180, 76 if !USE_CUSTOM_CLOCK_ON_MAP
		@create_time_window = Time_Window.new(x, y, w, h, OPACITY_CLOCK)
	end
	
	def create_calendar_window
		dx, dy = CALENDAR_X, CALENDAR_Y
		dw, dh = 214, 100
		@create_calendar_scene_map = Calendar_Scene_Map_Window.new(dx, dy, dw, dh) 
	end
	
	alias denis_kyznetsov_game_time_scn_map_update update
	def update
		denis_kyznetsov_game_time_scn_map_update
		if $Game_Time.sec % 2 == 0 && $imported["DenKyz_Game_Time_Calendar"]
			Functions.transfer?
			Functions.complete?
		end
		
		if $Game_Time_Notification && USE_CALENDAR_WINDOW_NOTIFICATION
			$Game_Time_Notification.update if !$Game_Time_Notification.disposing
		end
		
		if !GAME_TIME_BUTTON.is_a?(Integer)
			if Input.trigger?(GAME_TIME_BUTTON) && @time_window_exist && $SHOW_START_GAME_TIME_WINDOW
				time_visible(false)
			elsif Input.trigger?(GAME_TIME_BUTTON) && !@time_window_exist && !$SHOW_START_GAME_TIME_WINDOW
				time_visible(true)
			end
		end
		
		if $imported["DenKyz_Game_Time_Calendar"]
			begin
				if USE_CALENDAR && USE_CALENDAR_WINDOW && !CALENDAR_TIME_BUTTON.is_a?(Integer)
					if Input.trigger?(CALENDAR_TIME_BUTTON) && @calendar_window_exist && $SHOW_START_GAME_CALENDAR_WINDOW
						calendar_visible(false)
					elsif Input.trigger?(CALENDAR_TIME_BUTTON) && !@calendar_window_exist && !$SHOW_START_GAME_CALENDAR_WINDOW
						calendar_visible(true)
					end
				end
			rescue
			end
		end
		
		if $imported["DenKyz_Game_Time_Weather"]
			begin
				if USE_TEMPERATURE && USE_TEMPERATURE_WINDOW && !TEMPERATURE_BUTTON.is_a?(Integer)
					if Input.trigger?(TEMPERATURE_BUTTON) && @temp_window_exist && $SHOW_START_GAME_TIME_TEMPERATURE
						temp_visible(false)
					elsif Input.trigger?(TEMPERATURE_BUTTON) && !@temp_window_exist && !$SHOW_START_GAME_TIME_TEMPERATURE
						temp_visible(true)
					end
				end
			rescue
			end
		end
	end
	
end # Scene_Map < Scene_Base
class Game_Map
	include Time_Settings
	
	alias denis_kyznetsov_game_time_game_map_setup setup
	def setup(map_id)
		denis_kyznetsov_game_time_game_map_setup(map_id)
		
		if $imported["DenKyz_Game_Time_Weather"]
			begin
				# отключить погоду на карте с тегом внутри
				$USE_DEFAULT_WEATHER = false if USE_DEFAULT_WEATHER && @map.note.include?("<No_Weather>")
				
				# получаем грацицы температуры для карты, если они есть
				if @map.note =~ /<Temp\s*=\s*((-?[\d]+)\s*,\S?\s*(-?[\d]+))>/i
					$Custom_Temperature[0] = $2.to_i
					$Custom_Temperature[1] = $3.to_i
				else
					$Custom_Temperature = []
				end
			rescue
			end	
		end
		
		$STOP_TIME_UPDATE = (@map.note.include?("<No_Time_Update>") ? true : false)
		
		if @map.note =~ /<Light_Hour\s*=\s*([\d+])>/i
			$STOP_TIME_UPDATE_LIGHT_HOUR = $1.to_i
		else
			$STOP_TIME_UPDATE_LIGHT_HOUR = -1
		end
	end
	
end # class Game_Map
class Time_Window < Window_Base
	include Time_Settings
	
	def initialize(x = 0, y = 0, w = Graphics.width, h = Graphics.height, opacity)
		super(x, y, w, h)
		if opacity != -1 # прозрачность, указанная пользователем, если есть
			self.opacity = opacity
			self.back_opacity = opacity
			self.contents_opacity = opacity
		end
		@width = w
		@height = h
		update
	end
	
	def blink # мигающее двоеточие
		return ":" if Graphics.frame_count % BLINK_SPEED > BLINK_SPEED/2
		return " "
	end
	
	def date # дата
		return ($Game_Time.day.to_s + " " + CALENDAR_MONTHS[$Game_Time.month] + " " + $Game_Time.year.to_s) if !USE_CUSTOM_CLOCK_ON_MAP
		date = ""
		return date if CUSTOM_CLOCK_DATE == []
		for i in 0..CUSTOM_CLOCK_DATE.size - 1
			case CUSTOM_CLOCK_DATE[i]
			when "День"
				date += " " + $Game_Time.day.to_s
			when "День недели"
				date += " " + DAYS_WEEK[$Game_Time.month]
			when "Месяц(число)"
				date += " " + $Game_Time.month.to_s
			when "Месяц(название)"
				date += " " + CALENDAR_MONTHS[$Game_Time.month]
			when "Год"
				date += " " + $Game_Time.year.to_s
			else
				date +=  " " + CUSTOM_CLOCK_DATE[i].to_s
			end
		end
		return date 
	end
	
	def plus_minutes
		return $Game_Time.min < 10 ? "0" + $Game_Time.min.to_s : $Game_Time.min.to_s
	end
	
	def plus_seconds
		return $Game_Time.sec < 10 ? "0" + $Game_Time.sec.to_s : $Game_Time.sec.to_s
	end
	
	def time # время
		return ($Game_Time.hour < 10 ? "0" + $Game_Time.hour.to_s : $Game_Time.hour.to_s) + 
		(USE_BLINK ? blink : ":") + plus_minutes + 
		(SHOW_SECONDS ? ((USE_BLINK ? blink : ":") + plus_seconds) : "") if !USE_CUSTOM_CLOCK_ON_MAP
		time = ""
		return time if CUSTOM_CLOCK_TIME == []
		for i in 0..CUSTOM_CLOCK_TIME.size - 1
			case CUSTOM_CLOCK_TIME[i]
			when "Час"
				time += $Game_Time.hour.to_s
			when "blink"
				time += USE_BLINK ? blink : ":"
			when "Минуты"
				time += plus_minutes
			when "Секунды"
				time += SHOW_SECONDS ? plus_seconds : ""
			else
				time += CUSTOM_CLOCK_TIME[i].to_s
			end
		end
		return time
	end
	
	def update
		if (@now_sec != $Game_Time.sec && SHOW_SECONDS) || (@now_min != $Game_Time.min && !SHOW_SECONDS) || USE_BLINK || @now_hour != $Game_Time.hour || @now_day != $Game_Time.day || @now_month != $Game_Time.month || @now_year != $Game_Time.year
			setup_variables
			contents.clear
			show_date = date
			show_time = time
			y = 0
			draw_text(0, y, @width - 24, 32, show_date, 1)
			return if show_time == ""
			y += 24 if show_date != ""
			draw_text(0, y, @width - 24, 32, show_time, 1)
		end
	end
	
	def setup_variables
		@now_sec = $Game_Time.sec
		@now_min = $Game_Time.min
		@now_hour = $Game_Time.hour
		@now_day = $Game_Time.day
		@now_month = $Game_Time.month
		@now_year = $Game_Time.year
	end
	
end # class Time_Window < Window_Base
class Scene_Menu < Scene_MenuBase
	include Time_Settings
	
	alias denis_kyznetsov_game_time_scn_menu_start start
	def start
		denis_kyznetsov_game_time_scn_menu_start
		create_time_window if TIME_IN_MENU
	end
	
	def create_time_window
		x, y, w, h = MENU_CLOCK_X, MENU_CLOCK_Y, MENU_CLOCK_WIDTH, MENU_CLOCK_HEIGHT
		x, y, w, h = @gold_window.x, @gold_window.y - 74, 160, 74 if !USE_CUSTOM_CLOCK_IN_MENU
		@create_time_window = Time_Window.new(x, y, w, h, OPACITY_MENU_CLOCK)
	end
	
	alias denis_kyznetsov_game_time_scn_menu_create_command_  window  create_command_window
	def create_command_window
		denis_kyznetsov_game_time_scn_menu_create_command_  window
		begin
			@command_window.set_handler(:calendar, method(:calendar)) if USE_CALENDAR
		rescue
		end
	end
	
end # Scene_Menu < Scene_MenuBase
module DataManager
	class << self
		
		alias denis_kyznetsov_dt_mngr_setup_new_game setup_new_game
		def setup_new_game
			denis_kyznetsov_dt_mngr_setup_new_game
			Functions.new_game
		end
		
		alias denis_kyznetsov_dt_mngr_make_save_contents make_save_contents
		def make_save_contents
			contents = denis_kyznetsov_dt_mngr_make_save_contents
			contents[:Game_Time] = $Game_Time
			contents[:Game_Time_Quests] = $QUESTS
			contents[:Game_Time_Last_Quests] = $LAST_QUESTS
			contents[:Game_Time_First_Day] = $FIRST_DAY
			contents[:Game_Time_DUP] = $Game_Time_DUP
			contents
		end
		
		alias denis_kyznetsov_dt_mngr_extract_save_contents extract_save_contents
		def extract_save_contents(contents)
			denis_kyznetsov_dt_mngr_extract_save_contents(cont  ents)
			Functions.new_game
			$Game_Time = contents[:Game_Time]
			$QUESTS = contents[:Game_Time_Quests]
			$LAST_QUESTS = contents[:Game_Time_Last_Quests]
			$FIRST_DAY = contents[:Game_Time_First_Day]
			$Game_Time_DUP = contents[:Game_Time_DUP]
		end
	end
	
end # module DataManager
Социальные закладки